package io.renren.common.utils;


import org.apache.commons.beanutils.PropertyUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;

/**
 * Description:
 * All Rights Reserved.
 *
 * @version 1.0 2017/7/10  by YuanChao(yuanchao@zuche.com) 创建
 */
public class PropertiesCopyUtil {


    /**
     * 复制一个对象
     * @param orig 对象来源
     * @param clazz 需要的结果类型
     * @param <T> 泛型
     * @return <T> <T>
     */
    public static <T> T copy(Object orig, Class<T> clazz) {
        if(orig == null){
            return null;
        }
        T dest ;
        try {
            dest = clazz.newInstance();
            PropertyUtils.copyProperties(dest, orig);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return dest;
    }

//    public static <T> T copy(Collection orig,Class<T> clazz) {
//        try {
//            T dests = clazz.newInstance() ;
//            if(dests instanceof Collection){
//                for(Object o:orig){
//                    Object dest = new Object();
//                    PropertyUtils.copyProperties(dest, o);
//                    ((Collection) dests).add(dest);
//                }
//
//            }else {
//                throw new IllegalArgumentException("参数异常，请检查class参数类型");
//            }
//            return dests;
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
//    }


    /**
     * 复制一个list
     * @param origs 对象来源
     * @param clazz 需要的结果类型
     * @param <T> 泛型
     * @return <T> ArrayList<T>
     */
    public static <T> ArrayList<T> copy2ArrayList(Collection origs, Class<T> clazz){
        if(origs == null){
            return null;
        }
        ArrayList<T> list = new ArrayList<>();
        try{
            for(Object orig:origs){
                if(orig != null) {
                    T dest = clazz.newInstance();
                    PropertyUtils.copyProperties(dest, orig);
                    list.add(dest);
                } else {
                    list.add(null);
                }
            }
        }catch (Exception e){
            throw new RuntimeException(e);
        }
        return list;
    }

    /**
     * 复制一个list
     * @param origs 对象来源
     * @param clazz 需要的结果类型
     * @param <T> 泛型
     * @return <T> LinkedList<T>
     */
    public static <T> LinkedList<T> copy2LinkedList(Collection origs, Class<T> clazz){
        if(origs == null){
            return null;
        }
        LinkedList<T> list = new LinkedList<>();
        try{
            for(Object orig:origs){
                T dest = clazz.newInstance();
                PropertyUtils.copyProperties(dest,orig);
                list.add(dest);
            }
        }catch (Exception e){
            throw new RuntimeException(e);
        }
        return list;
    }

    /**
     * 复制一个list
     * @param origs 对象来源
     * @param clazz 需要的结果类型
     * @param <T> 泛型
     * @return <T> HashSet<T>
     */
    public static <T> HashSet<T> copy2HashSet(Collection origs, Class<T> clazz){
        if(origs == null){
            return null;
        }
        HashSet<T> set = new HashSet<>();
        try{
            for(Object orig:origs){
                T dest = clazz.newInstance();
                PropertyUtils.copyProperties(dest,orig);
                set.add(dest);
            }
        }catch (Exception e){
            throw new RuntimeException(e);
        }
        return set;
    }




}
